package cn.migu.music.hangupsms.utils;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.apache.commons.lang.StringUtils;

import cn.migu.music.common.utils.LogUtils;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class LocalFileUtil {
    private LocalFileUtil() {}

    /**
     * 获取文件目录
     * 
     * @param sPath
     *            文件路径
     * @return
     */
    public static File[] getFiles(String sPath) {
        sPath = setPath(sPath);
        File dirFile = new File(sPath);
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return new File[0];
        }
        return dirFile.listFiles();
    }

    /**
     * 文件路径后缀赋值
     * 
     * @param sPath
     *            文件路径
     * @return
     */
    public static String setPath(String sPath) {
        if (!StringUtils.endsWith(sPath, File.separator)) {
            sPath = sPath + File.separator;
        }
        return sPath;
    }

    public static void deleteLocalFile(String filePath) {
        try {
            Files.deleteIfExists(Paths.get(filePath));
            LogUtils.info(log, "delete local file success, fileName: %s", filePath);
        } catch (Exception ex) {
            LogUtils.error(ex, log, "delete local file error");
        }
    }

    /**
     * 转换文件大小单位
     * 
     * @param size
     *            文件大小
     * @return
     */
    public static String formatFileSize(Long size) {
        String sizeName;
        if (1024 * 1024 > size && size >= 1024) {
            sizeName = String.format("%.2f", size.doubleValue() / 1024) + "KB";
        } else if (1024 * 1024 * 1024 > size && size >= 1024 * 1024) {
            sizeName = String.format("%.2f", size.doubleValue() / (1024 * 1024)) + "MB";
        } else if (size >= 1024 * 1024 * 1024) {
            sizeName = String.format("%.2f", size.doubleValue() / (1024 * 1024 * 1024)) + "GB";
        } else {
            sizeName = size + "B";
        }
        return sizeName;
    }

    /**
     * 根据路径删除指定的目录或文件，无论存在与否
     * 
     * @param sPath
     *            要删除的目录或文件
     * @return 删除成功返回 true，否则返回 false。
     */
    public static boolean deleteFolder(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        // 判断目录或文件是否存在
        if (!file.exists()) { // 不存在返回 false
            return flag;
        } else {
            // 判断是否为文件
            if (file.isFile()) { // 为文件时调用删除文件方法
                return deleteFile(sPath);
            } else { // 为目录时调用删除目录方法
                return deleteDirectory(sPath);
            }
        }
    }

    /**
     * 删除单个文件
     * 
     * @param sPath
     *            被删除文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    private static boolean deleteFile(String sPath) {
        boolean flag = false;
        File file = new File(sPath);
        // 路径为文件且不为空则进行删除
        if (file.isFile() && file.exists()) {
            fileDelete(file.toPath());
            flag = true;
        }
        return flag;
    }

    /**
     * 删除目录（文件夹）以及目录下的文件
     * 
     * @param sPath
     *            被删除目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    private static boolean deleteDirectory(String sPath) {
        sPath = setPath(sPath);
        File dirFile = new File(sPath);
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if (!dirFile.exists() || !dirFile.isDirectory()) {
            return false;
        }
        boolean flag = true;
        // 删除文件夹下的所有文件(包括子目录)
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
            } else { // 删除子目录
                flag = deleteDirectory(files[i].getAbsolutePath());
            }
            if (!flag) {
                break;
            }
        }
        if (!flag)
            return false;
        return fileDelete(dirFile.toPath());
    }

    private static boolean fileDelete(Path path) {
        try {
            Files.delete(path);
        } catch (Exception e) {
            LogUtils.error(e, log, "删除文件出错");
            return false;
        }
        return true;
    }
}
